package sk.uniba.fmph.asdf;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
 * Trieda predstavuje nadtriedu vsetkych serializovatelnych entit. Definuje jedinu abstraktnu metodu
 * validateState(), ktora zabezpeci korektnost precitaneho objektu zo suboru.
 *
 * @author Marek Timura
 * @serial
 */
public abstract class SerializableEntity implements java.io.Serializable {

	private static final long serialVersionUID = 4432972373794518060L;

    /**
     * Metoda ma za ulohu zvalidovat stav precitaneho objektu zo suboru.
     */
	public abstract void validateState();

    /**
     * Metoda skontroluje ci id objektu je nezaporne.
     * @param id id objektu
     */
    protected final void validateId(final int id) {
        if (id < -1) {
            throw new IllegalArgumentException(String.valueOf(id));
        }
    }

    /**
     * Metoda precita serializovany objekt z prudu dat a nasledne zvaliduje jeho stav.
     *
     * @param objectInputStream prud dat, z ktoreho sa objekt cita
     * @throws ClassNotFoundException nespravna definicia triedy
     * @throws IOException ak zlyhala input/output operacia
     */
    public final void readObject(ObjectInputStream objectInputStream) throws ClassNotFoundException, IOException {
        objectInputStream.defaultReadObject();
        validateState();
    }

    /**
     * Metoda zapise serializovatelny objekt do prudu dat.
     *
     * @param objectOutputStream prud dat, do ktoreho sa objekt zapise
     * @throws IOException ak zlyhala input/output operacia
     */
    public final void writeObject(ObjectOutputStream objectOutputStream) throws IOException {
        objectOutputStream.defaultWriteObject();
    }

}
